package utils

import (
	"log"
	"os"
	"text/template"

	"gorm.io/gorm"
)

// 路由模板
const routesTemplate = `package routes

import (
	"go_web/internal/handler/handler_sys"
	"github.com/gin-gonic/gin"
)

{{range .}}
func Init{{.}}Routes(router *gin.Engine, {{.}}Handler *handler_sys.{{.}}Handler) {
	{{.}}Group := router.Group("/api/{{. | ToSnakeCase}}")
	{
		{{.}}Group.GET("/detail", {{.}}Handler.Detail)
		{{.}}Group.GET("/page", {{.}}Handler.Page)
		{{.}}Group.POST("/add", {{.}}Handler.Add)
		{{.}}Group.POST("/edit", {{.}}Handler.Edit)
		{{.}}Group.POST("/delete", {{.}}Handler.Delete)
	}
}
{{end}}
`

// 生成 routes 文件并添加日志输出
func GenerateRoutes(db *gorm.DB, dbName string, modelNames []string) error {
	// 记录生成开始
	log.Printf("开始生成 routes 路由配置...\n")

	// 如果没有传入模型名，自动从数据库获取表名
	if len(modelNames) == 0 {
		tableList, err := getTables(db, dbName, nil)
		if err != nil {
			return err
		}
		for _, table := range tableList {
			modelName := toCamelCase(table.TableName)
			modelNames = append(modelNames, modelName)
		}
	}

	// 调用生成函数生成 routes 文件
	return generateRoutesFile(modelNames)
}

func generateRoutesFile(modelNames []string) error {
	// 使用模板
	tmpl, err := template.New("routes").Funcs(template.FuncMap{
		"ToSnakeCase": ToSnakeCase, // 使用之前的 ToSnakeCase 函数
	}).Parse(routesTemplate)
	if err != nil {
		log.Printf("模板解析失败: %v\n", err)
		return err
	}

	// 创建 routes.go 文件
	fileName := "./dal/routes/routes.go"
	file, err := os.Create(fileName)
	if err != nil {
		log.Printf("文件创建失败: %v\n", err)
		return err
	}
	defer file.Close()

	// 渲染模板
	err = tmpl.Execute(file, modelNames)
	if err != nil {
		log.Printf("模板渲染失败: %v\n", err)
		return err
	}

	// 输出生成成功的日志
	log.Printf("成功生成路由文件: %s\n", fileName)
	return nil
}

// 路由模板
const setupRoutesTemplate = `package routes

import (
	"go_web/internal/handler/handler_sys"
	"go_web/internal/service/service_sys"
	"github.com/gin-gonic/gin"
)

{{range .}}
func Setup{{.}}Routes(r *gin.Engine) {
	{{.}}Service := service_sys.New{{.}}Service()
	{{.}}Handler := handler_sys.New{{.}}Handler({{.}}Service)
	Init{{.}}Routes(r, {{.}}Handler)
}
{{end}}
`

// 生成 routes 文件并添加日志输出
func GenerateSetupRoutes(db *gorm.DB, dbName string, modelNames []string) error {
	// 记录生成开始
	log.Printf("开始生成 SetupRoutes 路由配置...\n")

	// 如果没有传入模型名，自动从数据库获取表名
	if len(modelNames) == 0 {
		tableList, err := getTables(db, dbName, nil)
		if err != nil {
			return err
		}
		for _, table := range tableList {
			modelName := toCamelCase(table.TableName)
			modelNames = append(modelNames, modelName)
		}
	}

	// 调用生成函数生成 routes 文件
	return generateSetupRoutesFile(modelNames)
}

func generateSetupRoutesFile(modelNames []string) error {
	// 使用模板
	tmpl, err := template.New("setupRoutes").Funcs(template.FuncMap{
		"ToSnakeCase": ToSnakeCase, // 使用之前的 ToSnakeCase 函数
	}).Parse(setupRoutesTemplate)
	if err != nil {
		log.Printf("模板解析失败: %v\n", err)
		return err
	}

	// 创建 routes.go 文件
	fileName := "./dal/routes/setup_routes.go"
	file, err := os.Create(fileName)
	if err != nil {
		log.Printf("文件创建失败: %v\n", err)
		return err
	}
	defer file.Close()

	// 渲染模板
	err = tmpl.Execute(file, modelNames)
	if err != nil {
		log.Printf("模板渲染失败: %v\n", err)
		return err
	}

	// 输出生成成功的日志
	log.Printf("成功生成路由文件: %s\n", fileName)
	return nil
}
